home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / include / madwifi / net80211 / ieee80211_proto.h < prev    next >
C/C++ Source or Header  |  2006-05-11  |  13KB  |  296 lines

  1. /*-
  2.  * Copyright (c) 2001 Atsushi Onoe
  3.  * Copyright (c) 2002-2005 Sam Leffler, Errno Consulting
  4.  * All rights reserved.
  5.  *
  6.  * Redistribution and use in source and binary forms, with or without
  7.  * modification, are permitted provided that the following conditions
  8.  * are met:
  9.  * 1. Redistributions of source code must retain the above copyright
  10.  *    notice, this list of conditions and the following disclaimer.
  11.  * 2. Redistributions in binary form must reproduce the above copyright
  12.  *    notice, this list of conditions and the following disclaimer in the
  13.  *    documentation and/or other materials provided with the distribution.
  14.  * 3. The name of the author may not be used to endorse or promote products
  15.  *    derived from this software without specific prior written permission.
  16.  *
  17.  * Alternatively, this software may be distributed under the terms of the
  18.  * GNU General Public License ("GPL") version 2 as published by the Free
  19.  * Software Foundation.
  20.  *
  21.  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
  22.  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  23.  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
  24.  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
  25.  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
  26.  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  27.  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  28.  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  29.  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  30.  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  31.  *
  32.  * $Id: ieee80211_proto.h 1441 2006-02-06 16:03:21Z mrenzmann $
  33.  */
  34. #ifndef _NET80211_IEEE80211_PROTO_H_
  35. #define _NET80211_IEEE80211_PROTO_H_
  36.  
  37. /*
  38.  * 802.11 protocol implementation definitions.
  39.  */
  40.  
  41. enum ieee80211_state {
  42.     IEEE80211_S_INIT    = 0,    /* default state */
  43.     IEEE80211_S_SCAN    = 1,    /* scanning */
  44.     IEEE80211_S_AUTH    = 2,    /* try to authenticate */
  45.     IEEE80211_S_ASSOC    = 3,    /* try to assoc */
  46.     IEEE80211_S_RUN        = 4,    /* associated */
  47. };
  48. #define    IEEE80211_S_MAX        (IEEE80211_S_RUN + 1)
  49.  
  50. #define    IEEE80211_SEND_MGMT(_ni,_type,_arg) \
  51.     ((*(_ni)->ni_ic->ic_send_mgmt)(_ni, _type, _arg))
  52.  
  53. extern const char *ieee80211_mgt_subtype_name[];
  54. extern const char *ieee80211_ctl_subtype_name[];
  55. extern const char *ieee80211_state_name[IEEE80211_S_MAX];
  56. extern const char *ieee80211_wme_acnames[];
  57. extern const char *ieee80211_phymode_name[];
  58.  
  59. void ieee80211_proto_attach(struct ieee80211com *);
  60. void ieee80211_proto_detach(struct ieee80211com *);
  61. void ieee80211_proto_vattach(struct ieee80211vap *);
  62. void ieee80211_proto_vdetach(struct ieee80211vap *);
  63.  
  64. struct ieee80211_node;
  65. int ieee80211_input(struct ieee80211_node *, struct sk_buff *, int, u_int32_t);
  66. int ieee80211_input_all(struct ieee80211com *, struct sk_buff *, int, u_int32_t);
  67. int ieee80211_setup_rates(struct ieee80211_node *, const u_int8_t *,
  68.     const u_int8_t *, int);
  69. void ieee80211_saveie(u_int8_t **, const u_int8_t *);
  70. void ieee80211_saveath(struct ieee80211_node *, u_int8_t *);
  71. void ieee80211_recv_mgmt(struct ieee80211_node *, struct sk_buff *,
  72.     int, int, u_int32_t);
  73. void ieee80211_sta_pwrsave(struct ieee80211vap *, int);
  74. int ieee80211_hardstart(struct sk_buff *, struct net_device *);
  75. int ieee80211_send_nulldata(struct ieee80211_node *);
  76. int ieee80211_send_qosnulldata(struct ieee80211_node *, int);
  77. int ieee80211_send_mgmt(struct ieee80211_node *, int, int);
  78. int ieee80211_send_probereq(struct ieee80211_node *,
  79.     const u_int8_t sa[IEEE80211_ADDR_LEN],
  80.     const u_int8_t da[IEEE80211_ADDR_LEN],
  81.     const u_int8_t bssid[IEEE80211_ADDR_LEN],
  82.     const u_int8_t *, size_t, const void *, size_t);
  83. struct sk_buff *ieee80211_encap(struct ieee80211_node *, struct sk_buff *, int *);
  84. void ieee80211_pwrsave(struct ieee80211_node *, struct sk_buff *);
  85.  
  86. void ieee80211_reset_erp(struct ieee80211com *, enum ieee80211_phymode);
  87. void ieee80211_set_shortslottime(struct ieee80211com *, int);
  88. int ieee80211_iserp_rateset(struct ieee80211com *, struct ieee80211_rateset *);
  89. void ieee80211_set11gbasicrates(struct ieee80211_rateset *, enum ieee80211_phymode);
  90. enum ieee80211_phymode ieee80211_get11gbasicrates(struct ieee80211_rateset *);
  91. void ieee80211_send_pspoll(struct ieee80211_node *);
  92.  
  93. /*
  94.  * Return the size of the 802.11 header for a management or data frame.
  95.  */
  96. static __inline int
  97. ieee80211_hdrsize(const void *data)
  98. {
  99.     const struct ieee80211_frame *wh = data;
  100.     int size = sizeof(struct ieee80211_frame);
  101.  
  102.     /* NB: we don't handle control frames */
  103.     KASSERT((wh->i_fc[0]&IEEE80211_FC0_TYPE_MASK) != IEEE80211_FC0_TYPE_CTL,
  104.         ("%s: control frame", __func__));
  105.     if ((wh->i_fc[1] & IEEE80211_FC1_DIR_MASK) == IEEE80211_FC1_DIR_DSTODS)
  106.         size += IEEE80211_ADDR_LEN;
  107.     if (IEEE80211_QOS_HAS_SEQ(wh))
  108.         size += sizeof(u_int16_t);
  109.     return size;
  110. }
  111.  
  112. /*
  113.  * Like ieee80211_hdrsize, but handles any type of frame.
  114.  */
  115. static __inline int
  116. ieee80211_anyhdrsize(const void *data)
  117. {
  118.     const struct ieee80211_frame *wh = data;
  119.  
  120.     if ((wh->i_fc[0]&IEEE80211_FC0_TYPE_MASK) == IEEE80211_FC0_TYPE_CTL) {
  121.         switch (wh->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK) {
  122.         case IEEE80211_FC0_SUBTYPE_CTS:
  123.         case IEEE80211_FC0_SUBTYPE_ACK:
  124.             return sizeof(struct ieee80211_frame_ack);
  125.         }
  126.         return sizeof(struct ieee80211_frame_min);
  127.     } else
  128.         return ieee80211_hdrsize(data);
  129. }
  130.  
  131. /*
  132.  * Template for an in-kernel authenticator.  Authenticators
  133.  * register with the protocol code and are typically loaded
  134.  * as separate modules as needed.
  135.  */
  136. struct ieee80211_authenticator {
  137.     const char *ia_name;        /* printable name */
  138.     int (*ia_attach)(struct ieee80211vap *);
  139.     void (*ia_detach)(struct ieee80211vap *);
  140.     void (*ia_node_join)(struct ieee80211_node *);
  141.     void (*ia_node_leave)(struct ieee80211_node *);
  142. };
  143. void ieee80211_authenticator_register(int, const struct ieee80211_authenticator *);
  144. void ieee80211_authenticator_unregister(int);
  145. const struct ieee80211_authenticator *ieee80211_authenticator_get(int);
  146.  
  147. struct eapolcom;
  148. /*
  149.  * Template for an in-kernel authenticator backend.  Backends
  150.  * register with the protocol code and are typically loaded
  151.  * as separate modules as needed.
  152.  */
  153. struct ieee80211_authenticator_backend {
  154.     const char *iab_name;        /* printable name */
  155.     int (*iab_attach)(struct eapolcom *);
  156.     void (*iab_detach)(struct eapolcom *);
  157. };
  158. void ieee80211_authenticator_backend_register(
  159.     const struct ieee80211_authenticator_backend *);
  160. void ieee80211_authenticator_backend_unregister(
  161.     const struct ieee80211_authenticator_backend *);
  162. const struct ieee80211_authenticator_backend *
  163.     ieee80211_authenticator_backend_get(const char *);
  164.  
  165. /*
  166.  * Template for an MAC ACL policy module.  Such modules
  167.  * register with the protocol code and are passed the sender's
  168.  * address of each received frame for validation.
  169.  */
  170. struct ieee80211_aclator {
  171.     const char *iac_name;        /* printable name */
  172.     int (*iac_attach)(struct ieee80211vap *);
  173.     void (*iac_detach)(struct ieee80211vap *);
  174.     int (*iac_check)(struct ieee80211vap *,
  175.         const u_int8_t mac[IEEE80211_ADDR_LEN]);
  176.     int (*iac_add)(struct ieee80211vap *,
  177.         const u_int8_t mac[IEEE80211_ADDR_LEN]);
  178.     int (*iac_remove)(struct ieee80211vap *,
  179.         const u_int8_t mac[IEEE80211_ADDR_LEN]);
  180.     int (*iac_flush)(struct ieee80211vap *);
  181.     int (*iac_setpolicy)(struct ieee80211vap *, int);
  182.     int (*iac_getpolicy)(struct ieee80211vap *);
  183. };
  184. void ieee80211_aclator_register(const struct ieee80211_aclator *);
  185. void ieee80211_aclator_unregister(const struct ieee80211_aclator *);
  186. const struct ieee80211_aclator *ieee80211_aclator_get(const char *name);
  187.  
  188. /* flags for ieee80211_fix_rate() */
  189. #define    IEEE80211_F_DOSORT    0x00000001    /* sort rate list */
  190. #define    IEEE80211_F_DOFRATE    0x00000002    /* use fixed rate */
  191. #define    IEEE80211_F_DONEGO    0x00000004    /* calc negotiated rate */
  192. #define    IEEE80211_F_DODEL    0x00000008    /* delete ignore rate */
  193. int    ieee80211_fix_rate(struct ieee80211_node *, int);
  194.  
  195. struct wmeParams {
  196.     u_int8_t wmep_acm;        /* ACM parameter */
  197.     u_int8_t wmep_aifsn;        /* AIFSN parameters */
  198.     u_int8_t wmep_logcwmin;        /* cwmin in exponential form */
  199.     u_int8_t wmep_logcwmax;        /* cwmax in exponential form */
  200.     u_int16_t wmep_txopLimit;    /* txopLimit */
  201.     u_int8_t wmep_noackPolicy;    /* No-Ack Policy: 0=ack, 1=no-ack */
  202. };
  203.  
  204. #define IEEE80211_EXPONENT_TO_VALUE(_exp) (1 << (u_int32_t)(_exp)) - 1
  205. #define IEEE80211_TXOP_TO_US(_txop)    (u_int32_t)(_txop) << 5
  206. #define IEEE80211_US_TO_TXOP(_us)    (u_int16_t)((u_int32_t)(_us)) >> 5
  207.  
  208. struct chanAccParams{
  209.     /* XXX: is there any reason to have multiple instances of cap_info_count??? */
  210.     u_int8_t cap_info_count;                 /* ver. of the current param set */
  211.     struct wmeParams cap_wmeParams[WME_NUM_AC];    /*WME params for each access class */ 
  212. };
  213.  
  214. struct ieee80211_wme_state {
  215.     u_int32_t wme_flags;
  216. #define    WME_F_AGGRMODE    0x00000001    /* STATUS: WME agressive mode */
  217.  
  218.     u_int wme_hipri_traffic;            /* VI/VO frames in beacon interval */
  219.     u_int wme_hipri_switch_thresh;        /* agressive mode switch thresh */
  220.     u_int wme_hipri_switch_hysteresis;    /* agressive mode switch hysteresis */
  221.  
  222.     struct chanAccParams wme_wmeChanParams;    /* configured WME parameters applied to itself*/
  223.     struct chanAccParams wme_wmeBssChanParams; /* configured WME parameters broadcasted to STAs*/
  224.     struct chanAccParams wme_chanParams;    /* channel parameters applied to itself*/
  225.     struct chanAccParams wme_bssChanParams;    /* channel parameters broadcasted to STAs*/
  226.     u_int8_t wme_nonAggressiveMode;       /* don't use aggressive params and use WME params */
  227.  
  228.     /* update hardware tx params after wme state change */
  229.     int (*wme_update)(struct ieee80211com *);
  230. };
  231.  
  232. void ieee80211_wme_initparams(struct ieee80211vap *);
  233. void ieee80211_wme_initparams_locked(struct ieee80211vap *);
  234. void ieee80211_wme_updateparams(struct ieee80211vap *);
  235. void ieee80211_wme_updateparams_locked(struct ieee80211vap *);
  236.  
  237. int ieee80211_open(struct net_device *);
  238. int ieee80211_init(struct net_device *, int);
  239. void ieee80211_start_running(struct ieee80211com *);
  240. int ieee80211_stop(struct net_device *);
  241. void ieee80211_stop_running(struct ieee80211com *);
  242. void ieee80211_beacon_miss(struct ieee80211com *);
  243. #ifdef ATH_SUPERG_DYNTURBO
  244. void ieee80211_dturbo_switch(struct ieee80211com *, int);
  245. #endif
  246. int ieee80211_new_state(struct ieee80211vap *, enum ieee80211_state, int);
  247. void ieee80211_print_essid(const u_int8_t *, int);
  248. void ieee80211_dump_pkt(struct ieee80211com *, const u_int8_t *, int, int, int);
  249. struct sk_buff *ieee80211_getcfframe(struct ieee80211vap *, int);
  250.  
  251. /*
  252.  * Beacon frames constructed by ieee80211_beacon_alloc
  253.  * have the following structure filled in so drivers
  254.  * can update the frame later w/ minimal overhead.
  255.  */
  256. struct ieee80211_beacon_offsets {
  257.     u_int16_t *bo_caps;        /* capabilities */
  258.     u_int8_t *bo_tim;        /* start of atim/dtim */
  259.     u_int8_t *bo_wme;        /* start of WME parameters */
  260.     u_int8_t *bo_tim_trailer;    /* start of fixed-size tim trailer */
  261.     u_int16_t bo_tim_len;        /* atim/dtim length in bytes */
  262.     u_int16_t bo_tim_trailerlen;    /* trailer length in bytes */
  263.     u_int8_t *bo_chanswitch;        /* where channel switch IE will go */
  264.     u_int8_t *bo_ath_caps;        /* where ath caps is */
  265.     u_int8_t *bo_xr;            /* start of xr element */
  266.     u_int8_t *bo_erp;        /* start of ERP element */
  267.     u_int16_t bo_chanswitch_trailerlen;
  268. };
  269. struct sk_buff *ieee80211_beacon_alloc(struct ieee80211_node *,
  270.     struct ieee80211_beacon_offsets *);
  271. int ieee80211_beacon_update(struct ieee80211_node *,
  272.     struct ieee80211_beacon_offsets *, struct sk_buff *, int);
  273.  
  274. /* XXX exposed due to of beacon code botch */
  275. int8_t *ieee80211_add_rates(u_int8_t *, const struct ieee80211_rateset *);
  276. u_int8_t *ieee80211_add_xrates(u_int8_t *, const struct ieee80211_rateset *);
  277. u_int8_t *ieee80211_add_wpa(u_int8_t *, struct ieee80211vap *);
  278. u_int8_t *ieee80211_add_erp(u_int8_t *, struct ieee80211com *);
  279. u_int8_t *ieee80211_add_athAdvCap(u_int8_t *, u_int8_t, u_int16_t);
  280. u_int8_t *ieee80211_add_xr_param(u_int8_t *, struct ieee80211vap *);
  281. u_int8_t *ieee80211_add_xr_param(u_int8_t *, struct ieee80211vap *);
  282. u_int8_t *ieee80211_add_wme_param(u_int8_t *, struct ieee80211_wme_state *, int);
  283. u_int8_t *ieee80211_add_country(u_int8_t *, struct ieee80211com *);
  284. u_int8_t *ieee80211_add_country(u_int8_t *, struct ieee80211com *);
  285. u_int8_t *ieee80211_add_athAdvCap(u_int8_t *, u_int8_t, u_int16_t);
  286.  
  287. /*
  288.  * Notification methods called from the 802.11 state machine.
  289.  * Note that while these are defined here, their implementation
  290.  * is OS-specific.
  291.  */
  292. void ieee80211_notify_node_join(struct ieee80211_node *, int);
  293. void ieee80211_notify_node_leave(struct ieee80211_node *);
  294. void ieee80211_notify_scan_done(struct ieee80211vap *);
  295. #endif /* _NET80211_IEEE80211_PROTO_H_ */
  296.